#ifndef _ARC_H_
#define _ARC_H_

////////////////////////////////////////////////////////////////////////////////
// Includes
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Namespaces
////////////////////////////////////////////////////////////////////////////////

namespace Types {

////////////////////////////////////////////////////////////////////////////////
// Implementation
////////////////////////////////////////////////////////////////////////////////

/**
 *  Generic Arc
 */
template <typename TA = int>
class Arc {

	public:

		/// Constructor
		Arc(const unsigned int target_node_index)
		:	target_node_index(target_node_index)
		{}

		/// Constructor
		Arc(const unsigned int index, const TA & data)
		:	data(data),
			target_node_index(target_node_index)
		{}

		/// Creates a copy of the given instance
		Arc(const Arc<TA> & inst)
		:	data(inst.data),
			target_node_index(inst.target_node_index)
		{}
		
		/// Affectation operator
		Arc & operator = (const Arc<TA> & inst) {
			if (this != &inst) {
				this->data = inst.data;
				this->target_node_index = inst.target_node_index;
			}
			return *this;
		}

		/// Returns the data (read only)
		const TA & GetData() const { return this->data; }

		/// Returns the data
		TA & Data() { return this->data; }

		/// Returns the target node index
		const unsigned int GetTargetNodeIndex() const { return this->target_node_index; }
		
	protected:

		/// Arc data
		TA data;

		/// Target node index
		unsigned int target_node_index;

};

////////////////////////////////////////////////////////////////////////////////
// Closing Namespaces
////////////////////////////////////////////////////////////////////////////////

}

////////////////////////////////////////////////////////////////////////////////

#endif
